#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <set>

using namespace std;

int getPrio(char ch)
{
    switch (ch) {
    case '+':
    case '-':
	return 1;
    case '/':
    case '*':	
	return 2;
    default:
	return 0;
    }
}

string eval(const string &infix)
{
    string ans;
    stack<char> stk;
    cout << infix.size() << endl;

    for (int i = 0; i < infix.size(); i++) {
	if (infix[i] >= '0' && infix[i] <= '9') {
	    ans += infix[i];
	} else if (infix[i] == '(') {
	    stk.push(infix[i]);
	} else if (infix[i] == ')') {
	    while(stk.top() != '(') {
		ans += stk.top();
		stk.pop();
	    }
	    stk.pop();
	} else {
	    while(!stk.empty() && getPrio(stk.top()) >= getPrio(infix[i])) {
		ans += stk.top();
		stk.pop();
	    }
	    stk.push(infix[i]);
	} 
    }
    while (!stk.empty()) {
	ans += stk.top();
	stk.pop();
    }
    return ans;
}

int main(int argc, char **argv)
{
    string str("1+2*(4+5)+4/(2+2)");
    cout << eval(str) << endl;
}
